import axios from 'axios'
import qs from 'qs'
import router from '../../router'
import { REQUEST_BASE_URL, SUCCESS, NEED_LOGIN } from '../../config'
import { debounce } from '../../utils'
import { Message } from 'element-ui'

// 消息防抖(警告)
const messageWarning = debounce(Message.warning, 1000, true)

// 消息防抖(错误)
const messageError = debounce(Message.error, 1000, true)

// 设置 axios 默认Url
axios.defaults.baseURL = REQUEST_BASE_URL

// 设置 axios 默认请求类型
axios.defaults.headers.post['Content-Type'] = 'application/json'

// 设置 axios 默认超时时间
axios.defaults.timeout = 360000

// 添加请求拦截
axios.interceptors.request.use(
  config => {
    return config
  },
  error => {
    // 错误的传参
    return Promise.reject(error)
  }
)

// 添加响应拦截器
axios.interceptors.response.use(
  response => {
    const { data } = response

    if (data.code === SUCCESS) {
      return data
    } else if (data.code === NEED_LOGIN) {
      // 跳转登录页面
      router.replace({
        path: '/login'
      })
      messageWarning(data.msg)
    } else {
      messageError(data.msg)
    }
    return Promise.reject(data)
  },
  error => {
    const { data } = error.response
    messageError(data.msg)
    // 返回接口返回的错误信息
    return Promise.reject(error.response.data)
  }
)

class Requset {
  /**
   * GET请求封装
   * @param url 请求地址
   * @param data 请求参数
   * @param config 配置对象
   */
  static get(url, params, config) {
    const data = {
      params
    }

    return axios.get(url, Object.assign(data, config))
  }

  /**
   * POST请求封装
   * @param url 请求地址
   * @param data 请求参数
   * @param config 配置对象
   */
  static post(url, data, config) {
    return axios.post(url, data, config)
  }

  /**
   * PUT请求封装
   * @param url 请求地址
   * @param data 请求参数
   * @param config 配置对象
   */
  static put(url, data, config) {
    return axios.put(url, data, config)
  }

  /**
   * DELETE请求封装
   * @param url 请求地址
   * @param data 请求参数
   * @param config 配置对象
   */
  static delete(url, params, config) {
    const data = {
      data: params
    }

    return axios.delete(url, Object.assign(data, config))
  }

  /**
   * 传入data是时用
   * @param url 请求地址
   * @param data 请求参数
   */
  static deleteRequest(url, data) {
    return axios.delete(url, {
      data,
      paramsSerializer: data => {
        return qs.stringify(data, { indices: false })
      }
    })
  }
}

export default Requset